package com.flying.map;

import org.junit.jupiter.api.Test;

import javax.print.attribute.standard.JobKOctets;
import java.nio.file.FileSystemNotFoundException;
import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;

/**
 * @ClassName TreeMapTest
 * @Author flying
 * @Date 2025/1/25 7:42
 * @Description
 *
 *  TODO
 *      TreeMap 是对键进行排序的一种容器
 *      底层使用红黑树存储，可以按照添加的key-value中的key指定的属性大小值进行排序
 *      考虑使用  自然排序 (Comparable)   定制排序  (Comparator)
 *      要求：向TreeMap中添加的key必须是同一类型的
 */
public class TreeMapTest {

    /**
     * TreeMap对自定义对象的自然排序
     *
     * 从大到小排序年龄，相等则按照名字首排序
     */
    @Test
    void test1(){
        Map<Person,Integer> map= new TreeMap<>();

        // 创建 Person 实例


        Person p1 = new Person("张三", 12);
        Person p2 = new Person("王柳", 42);
        Person p3 = new Person("荆轲", 12);
        Person p4 = new Person("刘邦", 18);
        Person p5 = new Person("百里守约", 76);

/*        // 需要将进行比较的对象设计成key
        map.put("p1",p1);
        map.put("p2",p2);
        map.put("p3",p3);
        map.put("p4",p4);
        map.put("p5",p5);*/

        map.put(p1,13);
        map.put(p2,32);
        map.put(p3,23);
        map.put(p4,51);
        map.put(p5,9);




        for (Map.Entry<Person, Integer> entry : map.entrySet()) {

            Person key = entry.getKey();
            Integer value = entry.getValue();

            System.out.println(key+"====="+ value);
        }

    }

    /**
     *  定制排序
     *
     *  年龄从小到大排序，相等按照名字排序
     */
    @Test
    void test2(){

        Comparator<Person> comparator = new Comparator<>() {
            @Override
            public int compare(Person o1, Person o2) {
                if (o1==null||o2==null){
                    throw  new NullPointerException("对象为null");
                }
                if (o1==o2){
                    return 0;
                }
                return  o1.age==o2.age? o1.getName().compareTo(o2.getName()):Integer.compare(o1.getAge(),o2.getAge());
            }
        };



        // 在容器生命时，传入比较器
        Map<Person,Integer>   map=new TreeMap<>(comparator);


        Person p1 = new Person("张三", 12);
        Person p2 = new Person("王柳", 42);
        Person p3 = new Person("荆轲", 12);
        Person p4 = new Person("刘邦", 18);
        Person p5 = new Person("百里守约", 76);


        map.put(p1,13);
        map.put(p2,32);
        map.put(p3,23);
        map.put(p4,51);
        map.put(p5,9);


        for (Map.Entry<Person, Integer> entry : map.entrySet()) {
            Person key = entry.getKey();
            Integer value = entry.getValue();

            System.out.println(key+"====="+ value);


        }




    }



}



